TCP 通信设置
本指南演示如何使用 Node-RED 配置 OV80i 相机与外部设备之间的 TCP 通信。使用 TCP 通信实现实时数据交换、远程控制或与自定义应用和系统的集成。
何时使用 TCP 通信: 实时数据流传输、自定义应用集成、与外部系统的双向通信、高频率数据交换,或当 HTTP/REST API 不适用时。
先决条件
- 已设置并连接的 OV80i 相机系统
- 具备 TCP 通信能力的目标设备/系统
- 相机与目标设备之间的网络连接
- 基本的 IP 地址和端口号知识
- 已激活的配方(成像和检测设置完成)
步骤 1:验证网络配置
1.1 检查相机 IP 地址
- 进入系统设置
- 记录相机 IP 地址(例如:10.250.0.100)
- 核实子网掩码及网络配置
1.2 确认目标设备网络
确保网络兼容性:
- 同一子网: 相机和目标设备必须处于相同网络范围
- 端口可访问: 目标设备端口不得被防火墙阻挡
- 网络连通性: 如可能,使用 ping 命令测试
1.3 网络要求
要求 | 相机 | 目标设备 | 备注 |
---|---|---|---|
IP 范围 | 10.250.0.100 | 10.250.0.xxx | 必须在同一子网 |
子网掩码 | 255.255.255.0 | 255.255.255.0 | 标准配置 |
端口访问 | 49155(示例) | 49155(示例) | 避免保留端口 |
防火墙 | 允许 TCP 流量 | 允许 TCP 流量 | 双向允许 |
步骤 2:访问 Node-RED 编辑器
2.1 进入 IO Block
- 点击配方面包屑菜单中的“IO Block”,或
- 从配方编辑器选择“配置 I/O”
2.2 打开 Node-RED 编辑器
- 点击
Configure IO
进入 Node-RED 流程编辑器 - 确认 Node-RED 界面正常加载
检查点: 应显示带有左侧节点面板的 Node-RED 流程编辑器。
步骤 3:配置 TCP 输入(接收数据)
3.1 添加 TCP 输入节点
- 在左侧面板(网络部分)找到 "tcp in" 节点
- 将 "tcp in" 节点拖拽到流程画布
- 双击节点进行配置
3.2 配置 TCP 输入设置
节点配置:
设置 | 值 | 说明 |
---|---|---|
类型 | Listen on | 相机作为服务器 |
端口 | 49155 | 相机监听端口 |
数据模式 | Stream | 连续数据流 |
数据类型 | UTF8 | 基于文本的通信 |
主题 | (可选) | 消息分类 |
3.3 TCP 输入配置步骤
- 服务器配置:
- 选择 "Listen on port"(服务器模式)
- 输入 端口号(例如 49155)
- 数据处理:
- 数据模式: 选择 "Stream" 以实现连续数据
- 数据类型: 选择 "UTF8"(文本)或 "Buffer"(二进制)
- 高级设置:
- 换行符: 如无特定分隔符需求,保持为空
- 主题: 可选消息路由标识
- 点击
Done
保存配置
3.4 端口选择指南
端口范围 | 用途 | 建议 |
---|---|---|
1-1023 | 系统保留端口 | 避免使用 |
1024-49151 | 注册端口 | 检查可用性 |
49152-65535 | 动态/私有端口 | 推荐使用 |
步骤 4:配置 TCP 输出(发送数据)
4.1 添加 TCP 输出节点
- 在左侧面板(网络部分)找到 "tcp out" 节点
- 将 "tcp out" 节点拖拽到流程画布
- 双击节点进行配置
4.2 配置 TCP 输出设置
节点配置:
设置 | 值 | 说明 |
---|---|---|
类型 | Connect to | 相机作为客户端 |
主机 | 192.168.0.200 | 目标设备 IP 地址 |
端口 | 49155 | 目标设备端口 |
模式 | Client | 出站连接 |
4.3 TCP 输出配置步骤
- 连接设置:
- 类型: 选择 "Connect to"(客户端模式)
- 主机: 输入 目标设备 IP 地址
- 端口: 输入 目标设备端口号
- 连接选项:
- 模式: 保持为 "Client"
- 结束连接: 根据使用场景配置
- 数据格式:
- Base64: 通常文本数据禁用
- TLS: 仅在需要安全连接时启用
- 点击
Done
保存配置
步骤 5:创建通信流程
5.1 构建完整流程
创建一个既能发送又能接收 TCP 数据的流程:
- 将以下节点添加到画布:
- Inject 节点(触发消息)
- Function 节点(消息处理)
- TCP Out 节点(发送数据)
- TCP In 节点(接收数据)
- Debug 节点(监控)
5.2 配置 Inject 节点
- 双击 Inject 节点
- 配置设置:
- 名称: "Send Message"
- 负载: 时间戳
- 主题: (留空)
- 点击
Done
5.3 配置 Function 节点
Function 节点用于格式化发送消息:
msg.payload = "Hello from OV80i camera";
return msg;
- 双击 Function 节点
- 将上述代码复制到“On Message”标签页
- 名称: "Format Message"
- 点击
Done
5.4 连接节点
按以下顺序连接节点:
发送流程:
- Inject → Function → TCP Out
- Function → Debug(查看发送消息)
接收流程:
- TCP In → Debug(查看接收消息)
5.5 完整流程结构
最终流程应包含:
- Inject 连接到 Function
- Function 同时连接到 TCP Out 和 Debug
- TCP In 连接到独立的 Debug 节点
结果: 点击 Inject 按钮即可发送消息,并在调试面板查看发送和接收消息。
步骤 6:配置消息格式
6.1 定义消息格式
保持消息结构简单:
消息类型 | 格式 | 示例 |
---|---|---|
简单文本 | 纯字符串 | "Hello from camera" |
状态更新 | 带信息的文本 | "STATUS: READY" |
数据值 | 键值格式 | "TEMPERATURE: 25.5" |
6.2 自定义消息示例
可根据需求修改 Function 节点实现不同消息类型:
简单状态消息:
msg.payload = "Camera Ready";
return msg;
时间戳消息:
msg.payload = "Time: " + new Date().toLocaleString();
return msg;
带数值的数据:
msg.payload = "INSPECTION_COUNT: 42";
return msg;
步骤 7:部署并测试配置
7.1 部署 Node-RED 流程
- 点击右上角的
Deploy
按钮 - 确认部署成功消息
- 检查节点状态指示器:
- 绿色点: 连接成功
- 红色点: 连接错误
- 黄色点: 正在尝试连接
7.2 测试 TCP 通信
7.2.1 基本连通性测试
使用命令行工具:
# 测试 TCP 连接(Linux/Mac)
telnet [camera-ip] [port]
# 示例:telnet 10.250.0.100 49155
# 使用 netcat 测试
nc [camera-ip] [port]
# 示例:nc 10.250.0.100 49155
Windows PowerShell:
Test-NetConnection -ComputerName 10.250.0.100 -Port 49155
7.2.2 发送测试消息
- 连接到相机 TCP 端口
- 发送测试命令:
- "STATUS" → 应收到状态响应
- "TRIGGER" → 应触发检测
- "INVALID" → 应处理未知命令
7.2.3 监控调试输出
- 打开 Node-RED 调试面板(右侧边栏)
- 通过 TCP 发送测试消息
- 确认调试输出显示:
- 接收的消息
- 处理结果
- 发送的响应
7.3 验证清单
测试项 | 预期结果 | 状态 |
---|---|---|
TCP 连接 | 成功连接相机端口 | ☐ |
消息接收 | 调试显示接收消息 | ☐ |
消息处理 | Function 节点正确处理 | ☐ |
响应发送 | 目标设备接收响应 | ☐ |
错误处理 | 无效消息被妥善处理 | ☐ |
步骤 8:与检测系统集成
8.1 连接检测触发器
将 TCP 通信与检测流程关联:
- 添加“All Block Outputs”节点(如尚未添加)
- 连接检测结果到 TCP 输出
- 格式化检测数据以便 TCP 传输
8.2 检测数据集成
Function 节点处理检测结果示例:
// 获取 All Block Outputs 的检测结果
const results = msg.payload;
// 提取关键信息
const inspectionSummary = {
result: results.pass ? "PASS" : "FAIL",
timestamp: new Date().toISOString(),
processing_time: results.processing_time,
roi_count: results.roi_results ? results.roi_results.length : 0
};
// 格式化为 TCP 传输的 JSON 字符串
msg.payload = JSON.stringify(inspectionSummary);
return msg;
8.3 双向控制
通过 TCP 实现远程控制:
// 处理远程命令
const command = msg.payload.toString().toUpperCase();
switch(command) {
case "START_INSPECTION":
// 触发检测流程
global.set("trigger_inspection", true);
msg.payload = "INSPECTION_STARTED";
break;
case "STOP_INSPECTION":
// 停止检测流程
global.set("trigger_inspection", false);
msg.payload = "INSPECTION_STOPPED";
break;
case "CHANGE_RECIPE":
// 配方切换逻辑
msg.payload = "RECIPE_CHANGED";
break;
}
return msg;
步骤 9:常见问题排查
9.1 连接问题
问题 | 症状 | 解决方案 |
---|---|---|
无法连接 | 状态指示红色 | 检查 IP 地址和端口 |
连接中断 | 状态指示黄色间歇 | 验证网络稳定性 |
超时错误 | 响应延迟 | 调整超时设置 |
端口冲突 | 连接被拒绝 | 使用不同端口号 |
9.2 数据传输问题
问题 | 症状 | 解决方案 |
---|---|---|
无数据接收 | 调试显示空消息 | 检查数据格式设置 |
数据损坏 | 调试乱码 | 验证编码(UTF8/Buffer) |
消息丢失 | 消息缺失 | 检查网络稳定性 |
大消息问题 | 数据被截断 | 使用更短消息 |
9.3 调试技巧
系统化排查方法:
- 在每个步骤启用调试节点
- 监控 Node-RED 日志错误
- 先使用简单 TCP 客户端测试
- 使用 ping 验证网络连通
成功!您的 TCP 通信已准备就绪
您的 TCP 通信系统现在可以:
- 在相机与外部设备间发送和接收数据
- 处理简单消息实现基础通信
- 通过调试节点监控数据流
- 为您的应用处理基础网络通信
持续维护
定期系统检查
- 监控连接稳定性
- 验证数据传输一致性
- 检查调试日志中的错误模式
- 网络变更后测试通信
后续步骤
完成基础 TCP 通信设置后:
- 使用已建立连接测试外部系统
- 根据需求自定义消息格式
- 随着需求增长添加更复杂逻辑
- 如 TCP 不满足需求,考虑其他通信方式
🔗 参见
- MQTT Communication Setup
- RS-232 Communication Setup
- Connect to PLC (Ethernet/IP, PROFINET)
- Node-RED Basics
- Overview Node-RED Custom Blocks
- IP & Network Discovery Failures
对于高吞吐量应用:
- 降低消息频率
- 批量发送多条消息
- 对大数据使用二进制格式
- 实现压缩
调试技巧
系统化排查方法:
- 在每个步骤启用调试节点
- 监控 Node-RED 日志错误
- 使用网络监控工具(如 Wireshark)
- 先使用简单 TCP 客户端测试
成功!您的 TCP 通信已准备就绪
您的 TCP 通信系统现在可以:
- 在相机与外部设备间发送和接收数据
- 处理远程控制命令
- 实时传输检测结果
- 通过适当错误处理优雅应对异常
- 与生产系统集成,实现自动化流程
持续维护
定期系统检查
- 监控连接稳定性
- 验证生产环境数据完整性
- 根据需要更新安全配置
- 根据使用情况优化性能
性能监控
- 跟踪消息吞吐量和延迟
- 监控错误率和连接失败
- 分析数据模式以优化系统
后续步骤
完成 TCP 通信设置后:
- 使用已建立协议集成外部系统
- 实现全面错误处理以适应生产环境
- 设置日志记录和监控系统健康
- 考虑生产部署的安全增强
🔗 参见
- MQTT Communication Setup
- [RS-232 Communication Setup](RS-232%20Communication%20Setup%20Node-Red%2021524ca125